package io.renren.modules.api.controller;


import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import io.renren.common.exception.RRException;
import io.renren.common.utils.DateUtils;
import io.renren.common.utils.R;
import io.renren.common.utils.RandomUtils;
import io.renren.common.validator.Assert;
import io.renren.modules.api.annotation.AuthIgnore;
import io.renren.modules.api.annotation.LoginUser;
import io.renren.modules.api.entity.UserEntity;
import io.renren.modules.api.service.TokenService;
import io.renren.modules.api.service.UserService;
import io.renren.modules.sys.service.SysUserTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * API登录授权
 *
 * @author chenshun
 * @email sunlightcs@gmail.com
 * @date 2017-03-23 15:31
 */
@RestController
@RequestMapping("/api")
public class ApiLoginController {

    @Autowired
    private UserService userService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private SysUserTokenService sysUserTokenService;

    //用来存手机号验证码
    private Map<String, Object> codemap = new HashMap<>();

    //阿里云短信验证码参数
    //产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";
    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    static final String accessKeyId = "LTAICvlv5mKALbq6";                       //千万家阿里云
    static final String accessKeySecret = "PY4VKwrMNVj8iHOyA3BIPb7YAthGuu";     //千万家阿里云

    /**
     * 登录
     */
    @AuthIgnore
    @PostMapping("login")
    public R login(String mobile, String password){

        Assert.isBlank(mobile, "手机号不能为空");
        Assert.isBlank(password, "密码不能为空");
        //用户登录
        long userId = userService.login(mobile, password);
        /*//生成token
        Map<String, Object> map = tokenService.createToken(userId);*/
        //生成token，并保存到数据库
        R r = sysUserTokenService.createToken(userId);
        return r;
        //return R.ok(map);
    }

    /**
     *  仅验证码登录
     */
    @AuthIgnore
    @PostMapping("loginByNoPassWd")
    public R loginByNoPassWd(String mobile, String smsCode){

        Assert.isBlank(mobile, "手机号不能为空");
        Assert.isBlank(smsCode, "验证码不能为空");

        String code = codemap.get(mobile).toString();
        if(!smsCode.equals(code)) {
            return R.error("验证码错误");
        }
        //用户登录
        Map<String, Object> map = userService.loginByNoPassWd(mobile);
        return R.ok(map);
    }

    /**
     * 获取手机短信验证码
     * @param mobile
     * @return
     */
/*    @AuthIgnore
    @PostMapping("getLoginCode")
    public R getLoginCode(String mobile){
        Map<String, String> para = new HashMap<String, String>();

        *//**
         * 目标手机号码，多个以“,”分隔，一次性调用最多100个号码，示例：139********,138********
         *//*
        para.put("mob", mobile);

        *//**
         * 微米账号的接口UID
         *//*
        para.put("uid", "QuSugydhxPUe");

        *//**
         * 微米账号的接口密码
         *//*
        para.put("pas", "h45knk4p");

        *//**
         * 接口返回类型：json、xml、txt。默认值为txt
         *//*
        para.put("type", "json");

        *//**
         * 短信内容。必须设置好短信签名，签名规范：

         * 1、短信内容一定要带签名，签名放在短信内容的最前面；

         * 2、签名格式：【***】，签名内容为三个汉字以上（包括三个）；

         * 3、短信内容不允许双签名，即短信内容里只有一个“【】”
         *
         *//*
        para.put("cid", "fG63vomkfYWT");

        String code = RandomUtils.generaterNumber(6);
        para.put("p1", code);
        *//**
         * 特别注意：参数传递时去除“<>”符号！
         *//*
        try {
            System.out.println(HttpClientHelper.convertStreamToString(
                    HttpClientHelper.get("http://api.weimi.cc/2/sms/send.html",
                            para), "UTF-8"));

            *//*System.out.println(HttpClientHelper.convertStreamToString(
                    HttpClientHelper.post(
                            "http://api.weimi.cc/2/sms/send.html", para),
                    "UTF-8"));*//*
        } catch (Exception e) {
            e.printStackTrace();
        }
        codemap.put(mobile, code);
        return R.ok().put("SmsCode", code);
    }*/

    /**
     * 获取手机短信验证码
     * @param mobile
     * @return
     */
    @AuthIgnore
    @PostMapping("getLoginCode")
    public R getLoginCode(String mobile){

        //可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
        String code = RandomUtils.generaterNumber(6);

        codemap.put(mobile, code);

        if ("13871530058".equals(mobile) || "15871471481".equals(mobile)) {
            return R.ok().put("isTest",true).put("SmsCode", code);
        }

        try {
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);

            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(mobile);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName("千万家配送");
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode("SMS_136540037");

            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam("{\"code\":\"" + code + "\"}");

            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");

            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            request.setOutId("yourOutId");

            //hint 此处可能会抛出异常，注意catch
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);

            //stringRedisTemplate.opsForValue().set(mobile,code);
            if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
                return R.ok().put("isTest",false).put("SmsCode", code);
            }else{
                return R.error(1,"验证码获取失败");
            }
        } catch (Exception e){
            throw new RRException("服务器短息发送异常",-2);
        }

    }

    /**
     * 上传照片
     * @param file
     * @return
     */
//    @AuthIgnore
    @RequestMapping(value = "/uploadImg", method = RequestMethod.POST, headers = {"Content-Type=multipart/form-data"})
    public R uploadImg(@RequestBody MultipartFile file, @LoginUser UserEntity userEntity, String type) {

        String filePath = "";
        String filename = "";
        // 判断文件是否为空
        if (!file.isEmpty()) {
            if (file.getSize() > 10240000) {
                throw new RRException("上传失败：文件大小不能超过10M");
            }
            try {
                //提取后缀
                String postfix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
                Long userId = userEntity.getUserId();
                UserEntity user = userService.queryObject(userId);
                if(user != null){
                    if("0".equals(type)){
                        filename = userId+"_face_" + DateUtils.format(new Date(), "yyyyMMddHHmmss") + postfix;
//                        user.setImagePath(filename);
                    }else{ //除了身份证以外的上传图片
                        filename = userId+"_bl_" + DateUtils.format(new Date(), "yyyyMMddHHmmss") + postfix;
//                        user.setBusinessLicence(filename);
                    }
//                    userService.save(user);

                }else{
                    return R.error().put("msg","用户不存在");
                }
                // 文件保存路径

                filePath = "D:/upload/face/"+ filename;
                File saveDir = new File(filePath);

                //判断目标文件所在的目录是否存在
                if (!saveDir.getParentFile().exists()) {
                    //如果目标文件所在的目录不存在，则创建父目录
                    saveDir.getParentFile().mkdirs();
                }
                // 转存文件
                file.transferTo(saveDir);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            throw new RRException("上传失败:请添加上传文件！");
        }
        System.out.println("filePath:" + filePath);

        return R.ok().put("url", filePath);//.put("fileId",ossEntity.getId());
    }









}
